package com.xh.core.service;

import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.elasticsearch.index.query.QueryBuilder;
import org.springframework.stereotype.Service;

import com.xh.core.bean.XhPage;

import io.searchbox.client.JestResult;
import io.searchbox.core.SearchResult;
import io.searchbox.core.SearchResult.Hit;

/**
 * ES操作 抽象方法 基本包含所有基本操作
 */
@Service
public interface IElasticSearchService {
	 /**
     * 创建索引
     * @param o ：返回对象
     * @param index ：文档在哪存放
     * @param type ： 文档表示的对象类别
     * @return
     */
    public <T> JestResult addIndex(T o , String id, String index , String type);
    /**
     * 批量插入
     * @param list
     * @param index
     * @param type
     * @return
     */
    public <T> boolean batchInsert(List<T> list, String index, String type);
    /**
     * 增加或更新
     * @param t
     * @param id
     * @param index
     * @param type
     * @return
     */
    public <T> boolean insertOrUpdateDoc(T t, String id, String index, String type); 
    /**
     * 修改
     * @param t
     * @param id
     * @param index
     * @param type
     * @return
     */
    public <T> boolean updateIndex(T t, String id, String index, String type); 
    /**
     * 删除索引
     * @param type ：当前删除document名称
     * @return
     */
    public JestResult deleteIndex(String index) ;
	
    /**
	 * 清除缓存
	 * @return
	 */
    public JestResult clearCache() ;

    /**
     * 关闭索引
     * @param type ：文档表示的对象类别
     * @return
     */
    
    public JestResult closeIndex(String type) ;
    
	/**
	 * 优化索引
	 * @return
	 */
    public JestResult optimizeIndex() ;
    
	/**
	 * 刷新索引
	 * @return
	 */
    public JestResult flushIndex();
    
	/**
	 * 判断索引是否存在
	 * @return
	 */
    public JestResult indicesExists();
    
    /**
     * 更新Document
     * @param index ：文档在哪存放
     * @param type ： 文档表示的对象类别
     * @param id ：文档唯一标识
     */
	public JestResult updateDocument(String script , String index, String type, String id);

    /**
     * 删除Document
     * @param index ：文档在哪存放
     * @param type ： 文档表示的对象类别
     * @param id ：文档唯一标识
     * @return
     */
    public JestResult deleteDocument(String id, String index,String type) ;

    /**
     * 根据条件删除
     * @param index
     * @param type
     * @param params
     */
    public JestResult deleteDocumentByQuery(String params, String index, String type);

    /**
     * 获取Document
     * @param o ：返回对象
     * @param index ：文档在哪存放
     * @param type ： 文档表示的对象类别
     * @param id ：文档唯一标识
     * @return
     * @throws IOException 
     */
    public <T> T getDocument(String index , String type , String id, Class<T> T);

    /**
     * 搜索
     * @param keyWord ：搜索关键字
     * @return 
     */
    public <T> List<Hit<T,Void>> createSearch(String keyWord , String type , T t , String... fields) ;

    /**
     * bulkIndex 操作
     * @param index
     * @param type
     * @param o
     */
    public <T> void bulkIndex(String index , String type , T t) ;
    
    /**
     * 搜索事件流图表数据
     * @param param
     * @return
     */
    public <T> List<T> queryAll(String index, String type, String param, Class<T> t);
    
    /**
     * 
     * @param map
     * @param type
     * @param param
     * @param t
     * @return
     */
    public <T> List<T> queryAll(Map<String, Object> map, String type, String param, Class<T> t);
    
    /**
     * 
     * @param query
     * @param type
     * @param param
     * @param t
     * @return
     */
    public <T> List<T> queryAll(QueryBuilder query, String type, String param, Class<T> t);
    
    /**
     * 
     * @param index
     * @param type
     * @param field
     * @param text
     * @param t
     * @return
     */
    public <T> List<T> termQuery(String field, Object text, String index, String type, Class<T> t);
    
    /**
     * 
     * @param index
     * @param type
     * @param field
     * @param texts
     * @param t
     * @return
     */
    public <T> List<T> termsQuery(String field, Collection<?> texts, String index, String type, Class<T> t);
    
    /**
     * 
     * @param index
     * @param type
     * @param field
     * @param text
     * @param t
     * @return
     */
    public <T> List<T> matchQuery(String field, Object text, String index, String type, Class<T> t);
    
    public Map matchQueryPercent(String field, Object text, String percent, String index, String type);

    public Map matchQueryPercent(String subjectField, String subjectId, String field, String text, String percent, String index, String type);
   
    /**
     * 
     * @param index
     * @param type
     * @param field
     * @param text
     * @param t
     * @return
     */
    public <T> List<T> fuzzyQuery(String field, Object text, String index, String type, Class<T> t);
    
    /**
     * 
     * @param map
     * @param index
     * @param type
     * @param pageObj
     * @param sort
     * @return
     */
    public <T> XhPage<T> queryByPage(Map<String, Object> map, String index, String type, XhPage<T> page, Class<T> t);
    
    /**
     * 
     * @param query
     * @param index
     * @param type
     * @param pageObj
     * @param sort
     * @return
     */
    public <T> XhPage<T> queryByPage(QueryBuilder query, String index, String type, XhPage<T> page, Class<T> t);

}
